import os
import sys
import argparse

def bin_to_c_array(input_file, output_file=None, array_name=None, bytes_per_line=16):
    """将二进制文件转换为C语言数组"""
    try:
        # 读取二进制文件
        with open(input_file, 'rb') as f:
            data = f.read()
        
        # 如果未指定数组名称，使用输入文件名（不包括扩展名）
        if array_name is None:
            array_name = os.path.splitext(os.path.basename(input_file))[0]
            print(f"[信息] 未指定数组名称，使用输入文件名: '{array_name}'")
        
        # 如果未指定输出文件名，使用数组名称.h
        if output_file is None:
            output_file = f"{array_name}.h"
            print(f"[信息] 未指定输出文件名，使用数组名称: '{output_file}'")
        else:
            # 确保输出文件名有.h后缀
            if not output_file.endswith('.h'):
                output_file = f"{output_file}.h"
                print(f"[信息] 自动添加.h后缀，输出文件名为: '{output_file}'")
        
        # 生成C语言数组
        c_array = []
        c_array.append(f"const unsigned char {array_name}[{len(data)}] = {{")
        
        # 每行生成指定数量的字节
        for i in range(0, len(data), bytes_per_line):
            line = "    "
            for j in range(i, min(i + bytes_per_line, len(data))):
                line += f"0x{data[j]:02X}, "
            c_array.append(line)
        
        # 添加结束括号
        c_array.append("};")
        
        # 写入输出文件
        with open(output_file, 'w') as f:
            f.write('\n'.join(c_array))
        
        print(f"[完成] 生成C语言数组文件: {output_file} ({len(data)} 字节)")
        return True
        
    except Exception as e:
        print(f"[错误] {str(e)}")
        return False

def main():
    # 设置命令行参数解析
    parser = argparse.ArgumentParser(
        description='将二进制文件转换为C语言数组',
        usage='%(prog)s [选项] 输入文件 [输出文件] [数组名称]'
    )
    
    parser.add_argument('input_file', help='输入的二进制文件')
    parser.add_argument('output_file', nargs='?', default=None, 
                       help='输出的C语言头文件（可选，默认为数组名.h）')
    parser.add_argument('array_name', nargs='?', default=None,
                       help='C语言数组名称（可选，默认为输入文件名）')
    parser.add_argument('-l', '--line-size', type=int, default=16,
                       help='每行的字节数（默认为16）')
    
    args = parser.parse_args()
    
    # 处理转换
    try:
        success = bin_to_c_array(args.input_file, args.output_file, args.array_name, args.line_size)
        sys.exit(0 if success else 1)
    except Exception as e:
        print(f"[错误] {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()